2010年07月04日
川俣晶の縁側ソフトウェア技術雑記 total 14455 count

Visual Studio 2010で、コンソールアプリケーション等からクラスライブラリを参照するとコンパイルエラーになる問題と対策

Written By: 川俣 晶連絡先

 Visual Studio 2010で、あるプロジェクトから別のプロジェクトを参照すると、常に起こるわけではありませんが、以下のような警告が出る場合があります。

  • C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(1360,9): warning MSB3253: 参照アセンブリ "c:\x\delme\ConsoleApplication24\ClassLibrary1\bin\Debug\ClassLibrary1.dll" は、現在のターゲット フレームワーク ".NETFramework,Version=v4.0,Profile=Client" 内にない "System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" に依存するため、解決できませんでした。ターゲット フレームワーク内にないアセンブリへの参照を削除するか、プロジェクトを再ターゲットしてください。

原因 §

 対象のフレームワークが一致してないためです。

 プロジェクト作成時のデフォルトは、コンソールアプリケーション等は".NET Framework 4.0.NET Framework 4.0 Client Profile"。

 クラスライブラリ等は、".NET Framework 4.0"です。

 つまり、単にプロジェクトを作って参照するとそれだけで潜在的な問題を孕みます。

対策 §

 プロジェクトのプロパティを開いて、参照している側と、されている側のフレームワークを統一します。

再現方法 §

  1. Visual Studio 2010を開く
  2. コンソールアプリの新しいソリューションを作る
  3. クラスライブラリのプロジェクトをそのソリューションに追加する
  4. コンソールアプリにクラスライブラリの参照を追加する
  5. クラスライブラリに".NET Framework 4.0.NET Framework 4.0 Client Profile"に含まれないアセンブリへの参照を追加する (System.Web等)
  6. クラスライブラリのコードに、このアセンブリに含まれるクラス等を利用するコードを書き込む (new System.Web.HtmlString("abc");等)
  7. コンパイルすると上記の警告が出ます

問題のややこしい点 §

 実は参照するだけでは警告は出ず、問題のあるクラスを利用した時点で警告が出ます。そのため、発見が遅れがちだろうと思います。

感想 §

 なぜか古いプロジェクトのTFSへの登録が上手く行かず、しょうがないのでプロジェクトを全て作り直したところ、問題に気づきました。